package com.loan.common.service;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;
import java.util.Collection;

/**
 * 基础服务接口，所有service接口都要集成
 *
 * @param <T>
 * @author shiguang
 */
public interface BaseService<T> {

    default boolean update(Wrapper<T> updateWrapper) {
        return this.update(null, updateWrapper);
    }

    /**
     * 逻辑删除
     * @param ids ids
     * @param entity 实体
     * @return
     */
    boolean logicDelete(Long[] ids, Class<T> entity);

    /**
     * 逻辑删除
     * @param ids
     */
    @Transactional(rollbackFor = Exception.class)
    void logicDelete(Long[] ids);

    /**
     * 插入一条数据
     * @param entity
     * @return
     */
    boolean insert(T entity);

    /**
     * 批量插入，该方法不支持oracle,SQL server
     * @param entityList
     * @return
     */
    boolean insertBatch(Collection<T> entityList);

    /**
     * 批量插入
     * @param entityList 实体对象集合
     * @param batchSize 插入批次数量
     * @return
     */
    boolean insertBatch(Collection<T> entityList,int batchSize);

    /**
     * 根据id选择修改
     * @param entity
     * @return
     */
    boolean updateById(T entity);

    /**
     * 根据whereentity条件，更新
     * @param entity 实体对象
     * @param updateWrapper 实体对象封装操作类
     * @return
     */
    boolean update(T entity,Wrapper<T> updateWrapper);

    /**
     * 根据id 批量更新
     * @param entityList
     * @return
     */
    boolean updateBatchById(Collection<T> entityList);

    /**
     * 根据id批量更新
     * @param entityList 实体对象集合
     * @param batchSize 更新批次数量
     * @return
     */
    boolean updateBatchById(Collection<T>entityList,int batchSize);

    /**
     * 根据id查询
     * @param id
     * @return
     */
    T selectById(Serializable id);

    /**
     * 根据id删除
     * @param id
     * @return
     */
    boolean deleteById(Serializable id);

    /**
     * 删除（根据id批量删除）
     * @param idList
     * @return
     */
    boolean deleteBatchIds(Collection<? extends Serializable> idList);
}
